Open In Colab

In [1]:
%%html
<style>
  table {margin-left: 0 !important;}
</style>

Trabalho em Grupo

(até 4 integrantes)

  • Curso: FGV MBA - Business Analytics and Big Data
  • Disciplina: Modelagem Estatística Avançada
  • Professor: Rodrigo Marotti Togneri

Alunos

Github Nome Matricula E-mail
Daniel Campos A57635769 daniel.ferraz.campos@gmail.com
Leandro Daniel A57622988 contato@leandrodaniel.com
Rodrigo Goncalves A57566093 rodrigo.goncalves@me.com
Ygor Lima A57549661 ygor_redesocial@hotmail.com

Enunciado

Escolha um dentre os seguintes datasets:

  • Gas Prices in Brazil 2004-2019 (compartilhado em sala de aula)
  • Outro da preferência do grupo.

Para o dataset escolhido, deve-se:

  1. CONTEXTO: Contextualizar brevemente os dados (de que tratam os dados? 1 parágrafo entre 5 e 10 linhas).

  2. QUESTÕES DE NEGÓCIO: Estabelecer uma questão relevante a ser respondida.

  3. MONTAGEM DE DATASET: Montar o(s) dataset(s) final(is) para responder as questões.

  4. CARACTERIZAÇÃO DE DATASETS: Caracterizar as colunas (nome, tipo, significado).

  5. VISUALIZAÇÃO E DISCUSSÃO:

    a. Gerar plots que permitam tirar conclusões claras dos dados (a questão deve ser suficientemente complexa para que exija minimamente dois gráficos distintos complementares).

    b. Os gráficos devem ser interpretados e discutidos, e as conclusões acerca dos mesmos e das questões de negócio devem ser apresentadas

  6. CONCLUSÕES: Relembrar a questão levantada e sumarizar as conclusões obtidas.

    O trabalho deverá ser desenvolvido em Jupyter notebook e deverá ser entregue na data combinada com o professor em formato .ipynb já rodado e com outputs salvos no arquivo entregue. Organize o documento de modo que ele esteja dividido nas 6 seções propostas acima.

Respostas

1. CONTEXTO: Contextualizar brevemente os dados (de que tratam os dados? 1 parágrafo entre 5 e 10 linhas).

Escolhemos trabalhar com o dataset fornecido referente ao histórico de preços de combustíveis de 2004 a 2019.

A ANP (Agencia Nacional de Petróleo) publica semanalmente relatórios de Gás, Diesel e outros combustíveis usados no país.

Esta publicação traz o valor médio, mínimo e máximo, de revenda e distribuição, por unidade de medida padrão de cada combustível, agrupados por região e unidade da federação.

O conjunto de dados apresenta os preços de revenda e distribuiçao, (médio, mínimo e máximo), em periodicidade semanal para os seguintes produtos:

  • ETANOL HIDRATADO
  • GASOLINA COMUM
  • GLP
  • GNV
  • ÓLEO DIESEL
  • ÓLEO DIESEL S10

Além dos preços de revenda e distribuiçao, (médio, mínimo e máximo), o conjunto de dados apresneta algumas informações adicionais:

  • Número de postos pesquisados
  • Unidade de medida
  • Desvio padão
  • Margem média
  • Coeficientes de variação

2. QUESTÕES DE NEGÓCIO: Estabelecer uma questão relevante a ser respondida.

Avaliar o comportamentos dos preços de combustíveis considerando informacões adicionais como cotação internacional do barril de petroleo, localidade, movimentações políticas internas e alterações da política de preços praticados pela Petrobras.

3. MONTAGEM DE DATASET: Montar o(s) dataset(s) final(is) para responder as questões.

Vamos iniciar pela importação dos dados em um pandas dataframe.

Neste passo nos preocupamos de definir os nomes das variáveis bem como o correto data type de cada coluna.

In [2]:
import pandas as pd
import numpy as np

pd.set_option('display.max_rows', 30)
pd.set_option('display.max_columns', 30)
pd.set_option("display.precision", 3)
pd.set_option('display.expand_frame_repr', False)

dtype = {'INDEX': np.int32, 
         'DATA INICIAL': np.object, 
         'DATA FINAL': np.object,
         'REGIÃO': 'category', 
         'ESTADO': 'category', 
         'PRODUTO': 'category',
         'NÚMERO DE POSTSOS PESQUISADOS': np.int32, 
         'UINDADE DE MEDIDA': 'category', 
         'PREÇO MÉDIO REVENDA': np.float64,
         'DESVIO PADRÃO REVENDA': np.float64, 
         'PRECO MÍNIMO REVENDA': np.float64, 
         'PRECO MÁXIMO REVENDA': np.float64,
         'MARGEM MÉDIA REVENDA': np.float64, 
         'COEF DE VARIAÇÃO REVENDA': np.float64, 
         'PREÇO MÉDIO DISTRIBUIÇÃO': np.float64,
         'DESVIO PADRÃO DISTRIBUIÇÃO': np.float64, 
         'PREÇO MÍNIMO DISTRIBUIÇÃO': np.float64, 
         'PREÇO MÁXIMO DISTRIBUIÇÃO': np.float64,
         'COEF DE VARIAÇÃO DISTRIBUIÇÃO': np.float64}

df_prices = pd.read_csv('https://raw.githubusercontent.com/ldaniel/Advanced-Statistical-Modelling/master/data/raw/data_gasPricesBR_2004-2019.tsv', 
                        sep = '\t',
                        dtype = dtype,
                        names = list(dtype),
                        skiprows = 1,
                        usecols = list(dtype),
                        index_col = 'INDEX',
                        na_values = ['-'],
                        parse_dates = ['DATA INICIAL', 'DATA FINAL'])

df_prices.head()
Out[2]:
DATA INICIAL DATA FINAL REGIÃO ESTADO PRODUTO NÚMERO DE POSTSOS PESQUISADOS UINDADE DE MEDIDA PREÇO MÉDIO REVENDA DESVIO PADRÃO REVENDA PRECO MÍNIMO REVENDA PRECO MÁXIMO REVENDA MARGEM MÉDIA REVENDA COEF DE VARIAÇÃO REVENDA PREÇO MÉDIO DISTRIBUIÇÃO DESVIO PADRÃO DISTRIBUIÇÃO PREÇO MÍNIMO DISTRIBUIÇÃO PREÇO MÁXIMO DISTRIBUIÇÃO COEF DE VARIAÇÃO DISTRIBUIÇÃO
INDEX
0 2004-05-09 2004-05-15 CENTRO OESTE DISTRITO FEDERAL ETANOL HIDRATADO 127 R$/l 1.288 0.016 1.19 1.350 0.463 0.012 0.825 0.110 0.420 0.967 0.133
1 2004-05-09 2004-05-15 CENTRO OESTE GOIAS ETANOL HIDRATADO 387 R$/l 1.162 0.114 0.89 1.449 0.399 0.098 0.763 0.088 0.501 1.050 0.115
2 2004-05-09 2004-05-15 CENTRO OESTE MATO GROSSO ETANOL HIDRATADO 192 R$/l 1.389 0.097 1.18 1.760 0.419 0.070 0.970 0.095 0.561 1.161 0.098
3 2004-05-09 2004-05-15 CENTRO OESTE MATO GROSSO DO SUL ETANOL HIDRATADO 162 R$/l 1.262 0.070 1.09 1.509 0.432 0.055 0.830 0.119 0.599 1.222 0.143
4 2004-05-09 2004-05-15 NORDESTE ALAGOAS ETANOL HIDRATADO 103 R$/l 1.181 0.078 1.05 1.400 0.240 0.066 0.941 0.077 0.744 1.032 0.082

Vamos utilizar a biblioteca pandas-profiling para verificar algumas caracteristicas adicionais do dataset.

conda install -c conda-forge pandas-profiling=2.3.0

Latest release

In [3]:
#!conda install -c conda-forge pandas-profiling=2.3.0
import pandas_profiling as pp
In [4]:
%%time
profile = df_prices.profile_report(style = {'full_width':True}, title = 'Brasil Histórico de Preços de Combustíveis',
                                     check_recoded = False,
                                     check_correlation_pearson = False,
                                     check_correlation_cramers = False,
                                     missing_diagrams = {
                                         'bar': False,
                                         'matrix': False,
                                         'heatmap': False,
                                         'dendrogram': False})
profile
Wall time: 2min 5s
Out[4]:

Agora podemos enriquecer os dados extraindo da DATA INICIAL informações como ano, mês e semana.

In [5]:
df_prices['ANO'] = pd.DatetimeIndex(df_prices['DATA_INICIAL']).year
df_prices['MES'] = pd.DatetimeIndex(df_prices['DATA_INICIAL']).month
df_prices['SEMANA'] = pd.DatetimeIndex(df_prices['DATA_INICIAL']).week
df_prices[['DATA_INICIAL', 'DATA_FINAL', 'ANO', 'MES', 'SEMANA']]
Out[5]:
DATA_INICIAL DATA_FINAL ANO MES SEMANA
INDEX
0 2004-05-09 2004-05-15 2004 5 19
1 2004-05-09 2004-05-15 2004 5 19
2 2004-05-09 2004-05-15 2004 5 19
3 2004-05-09 2004-05-15 2004 5 19
4 2004-05-09 2004-05-15 2004 5 19
... ... ... ... ... ...
106818 2019-06-23 2019-06-29 2019 6 25
106819 2019-06-23 2019-06-29 2019 6 25
106820 2019-06-23 2019-06-29 2019 6 25
106821 2019-06-23 2019-06-29 2019 6 25
106822 2019-06-23 2019-06-29 2019 6 25

106823 rows × 5 columns

4. CARACTERIZAÇÃO DE DATASETS: Caracterizar as colunas (nome, tipo, significado).

Vamos avaliar algumas características dos dados importados, como data types de cada variável, missing values,

In [6]:
df_prices.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 106823 entries, 0 to 106822
Data columns (total 21 columns):
DATA_INICIAL                     106823 non-null datetime64[ns]
DATA_FINAL                       106823 non-null datetime64[ns]
REGIÃO                           106823 non-null category
ESTADO                           106823 non-null category
PRODUTO                          106823 non-null category
NÚMERO_DE_POSTSOS_PESQUISADOS    106823 non-null int32
UINDADE_DE_MEDIDA                106823 non-null category
PREÇO_MÉDIO_REVENDA              106823 non-null float64
DESVIO_PADRÃO_REVENDA            106823 non-null float64
PRECO_MÍNIMO_REVENDA             106823 non-null float64
PRECO_MÁXIMO_REVENDA             106823 non-null float64
MARGEM_MÉDIA_REVENDA             103392 non-null float64
COEF_DE_VARIAÇÃO_REVENDA         106823 non-null float64
PREÇO_MÉDIO_DISTRIBUIÇÃO         103423 non-null float64
DESVIO_PADRÃO_DISTRIBUIÇÃO       103423 non-null float64
PREÇO_MÍNIMO_DISTRIBUIÇÃO        103423 non-null float64
PREÇO_MÁXIMO_DISTRIBUIÇÃO        103423 non-null float64
COEF_DE_VARIAÇÃO_DISTRIBUIÇÃO    103423 non-null float64
ANO                              106823 non-null int64
MES                              106823 non-null int64
SEMANA                           106823 non-null int64
dtypes: category(4), datetime64[ns](2), float64(11), int32(1), int64(3)
memory usage: 14.7 MB

Como podemos perceber temos alguns valores faltantes para algumas variáveis

In [7]:
df_prices.isnull().sum(axis = 0)
Out[7]:
DATA_INICIAL                        0
DATA_FINAL                          0
REGIÃO                              0
ESTADO                              0
PRODUTO                             0
NÚMERO_DE_POSTSOS_PESQUISADOS       0
UINDADE_DE_MEDIDA                   0
PREÇO_MÉDIO_REVENDA                 0
DESVIO_PADRÃO_REVENDA               0
PRECO_MÍNIMO_REVENDA                0
PRECO_MÁXIMO_REVENDA                0
MARGEM_MÉDIA_REVENDA             3431
COEF_DE_VARIAÇÃO_REVENDA            0
PREÇO_MÉDIO_DISTRIBUIÇÃO         3400
DESVIO_PADRÃO_DISTRIBUIÇÃO       3400
PREÇO_MÍNIMO_DISTRIBUIÇÃO        3400
PREÇO_MÁXIMO_DISTRIBUIÇÃO        3400
COEF_DE_VARIAÇÃO_DISTRIBUIÇÃO    3400
ANO                                 0
MES                                 0
SEMANA                              0
dtype: int64
In [8]:
# Diversas estatísticas da base
df_prices.describe()
Out[8]:
NÚMERO_DE_POSTSOS_PESQUISADOS PREÇO_MÉDIO_REVENDA DESVIO_PADRÃO_REVENDA PRECO_MÍNIMO_REVENDA PRECO_MÁXIMO_REVENDA MARGEM_MÉDIA_REVENDA COEF_DE_VARIAÇÃO_REVENDA PREÇO_MÉDIO_DISTRIBUIÇÃO DESVIO_PADRÃO_DISTRIBUIÇÃO PREÇO_MÍNIMO_DISTRIBUIÇÃO PREÇO_MÁXIMO_DISTRIBUIÇÃO COEF_DE_VARIAÇÃO_DISTRIBUIÇÃO ANO MES SEMANA
count 106823.000 106823.000 106823.000 106823.000 106823.000 103392.000 106823.000 103423.000 103423.000 103423.000 103423.000 103423.000 106823.000 106823.000 106823.000
mean 233.771 10.871 0.657 9.416 12.538 2.225 0.045 8.558 0.559 7.414 9.804 0.047 2011.802 6.484 26.438
std 403.283 17.753 1.349 15.092 20.841 4.375 0.025 13.603 1.257 11.681 15.933 0.042 4.392 3.443 15.056
min 1.000 0.766 0.000 0.590 0.999 0.001 0.000 0.506 0.000 0.326 0.599 0.000 2004.000 1.000 1.000
25% 42.000 2.072 0.072 1.900 2.310 0.282 0.029 1.795 0.047 1.674 1.946 0.021 2008.000 4.000 13.000
50% 104.000 2.718 0.114 2.510 2.999 0.383 0.041 2.335 0.077 2.220 2.507 0.030 2012.000 6.000 26.000
75% 243.000 3.752 0.191 3.499 4.150 0.560 0.058 3.306 0.151 3.143 3.520 0.061 2016.000 9.000 40.000
max 4167.000 99.357 10.748 90.000 120.000 36.847 0.395 83.137 18.385 83.000 94.500 0.780 2019.000 12.000 53.000
In [9]:
#Mostra todas os produtos da base
df_prices['PRODUTO'].unique()
Out[9]:
[ETANOL HIDRATADO, GASOLINA COMUM, GLP, GNV, ÓLEO DIESEL, ÓLEO DIESEL S10]
Categories (6, object): [ETANOL HIDRATADO, GASOLINA COMUM, GLP, GNV, ÓLEO DIESEL, ÓLEO DIESEL S10]

5. VISUALIZAÇÃO E DISCUSSÃO:

a. Gerar plots que permitam tirar conclusões claras dos dados (a questão deve ser suficientemente complexa para que exija minimamente dois gráficos distintos complementares).

Como exemplo podemos avaliar a evolução da média semanal anual dos preços de REVENDA e DISTRIBUIÇÃO da GASOLINA COMUM no estado de SAO PAULO

In [10]:
df_gas_sp = df_prices[(df_prices['PRODUTO'] == 'GASOLINA COMUM') & 
                      (df_prices['ESTADO'] == 'SAO PAULO')].groupby(['PRODUTO', 'ESTADO', 'ANO'])

df_gas_sp[['ANO','PREÇO_MÉDIO_REVENDA', 'PREÇO_MÉDIO_DISTRIBUIÇÃO']].describe(include = [np.float64])
Out[10]:
PREÇO_MÉDIO_REVENDA PREÇO_MÉDIO_DISTRIBUIÇÃO
count mean std min 25% 50% 75% max count mean std min 25% 50% 75% max
PRODUTO ESTADO ANO
GASOLINA COMUM SAO PAULO 2004 34.0 2.047 0.087 1.888 2.030 2.034 2.099 2.205 34.0 1.804 0.082 1.655 1.776 1.798 1.852 1.948
2005 50.0 2.233 0.087 2.144 2.162 2.191 2.349 2.372 50.0 1.979 0.084 1.893 1.908 1.942 2.087 2.119
2006 53.0 2.443 0.031 2.383 2.421 2.445 2.458 2.496 53.0 2.175 0.031 2.125 2.144 2.179 2.196 2.226
2007 52.0 2.414 0.024 2.376 2.393 2.417 2.430 2.458 52.0 2.094 0.042 2.039 2.050 2.086 2.128 2.161
2008 52.0 2.403 0.006 2.393 2.397 2.402 2.409 2.416 52.0 2.086 0.011 2.071 2.077 2.083 2.094 2.107
2009 50.0 2.403 0.028 2.353 2.381 2.402 2.420 2.457 50.0 2.087 0.030 2.043 2.059 2.087 2.107 2.140
2010 52.0 2.463 0.031 2.419 2.433 2.455 2.489 2.538 52.0 2.131 0.033 2.087 2.099 2.119 2.164 2.196
2011 52.0 2.643 0.078 2.501 2.635 2.662 2.669 2.826 52.0 2.274 0.072 2.176 2.250 2.268 2.276 2.497
2012 53.0 2.637 0.012 2.610 2.628 2.636 2.643 2.663 53.0 2.256 0.008 2.242 2.250 2.256 2.261 2.276
2013 52.0 2.736 0.046 2.629 2.711 2.721 2.768 2.837 52.0 2.339 0.041 2.261 2.314 2.325 2.375 2.426
2014 52.0 2.867 0.024 2.823 2.845 2.861 2.889 2.911 52.0 2.462 0.021 2.429 2.444 2.455 2.480 2.498
2015 51.0 3.189 0.159 2.905 3.105 3.141 3.232 3.515 51.0 2.770 0.143 2.497 2.713 2.734 2.800 3.061
2016 52.0 3.499 0.049 3.423 3.455 3.497 3.541 3.600 52.0 3.047 0.054 2.972 2.998 3.043 3.096 3.155
2017 53.0 3.580 0.180 3.234 3.455 3.604 3.668 3.975 53.0 3.135 0.202 2.771 2.981 3.144 3.257 3.576
2018 52.0 4.203 0.181 3.970 4.008 4.202 4.336 4.512 52.0 3.760 0.164 3.563 3.620 3.756 3.862 4.085
2019 25.0 4.120 0.110 3.966 4.012 4.109 4.214 4.287 25.0 3.691 0.149 3.483 3.562 3.713 3.816 3.914

Podemos visualizar os dados utilizando um gráfico de linha para um determinado ESTADO e PRODUTO.

In [11]:
%matplotlib inline

import matplotlib.pyplot as plt
from pandas.plotting import register_matplotlib_converters
register_matplotlib_converters()

plt.style.use('default')
plt.rcParams["figure.figsize"] = (10, 5)
plt.rcParams.update({'font.size': 10})

df_plot = df_prices[(df_prices['PRODUTO'] == 'GASOLINA COMUM') & 
                      (df_prices['ESTADO'] == 'SAO PAULO')]

x = df_plot['DATA_INICIAL']
y = df_plot['PREÇO_MÉDIO_REVENDA']

fig, ax = plt.subplots()

ax.plot(x, y, label = df_plot['PRODUTO'].iloc[0])

plt.title('Histórico de Preço - ' + df_plot['ESTADO'].iloc[0])
plt.legend()

plt.show()

Podemos fazer um loop por região e estado e verificar a evoluçao dos preços da GASOLINA COMUM por REGIÃO e ESTADO.

In [12]:
regions = df_prices['REGIÃO'].unique()

for region in regions:
    fig, ax = plt.subplots()
    df_plot = df_prices[(df_prices['REGIÃO'] == region) & (df_prices['PRODUTO'] == 'GASOLINA COMUM')]
    estados = df_plot['ESTADO'].unique()
    for estado in estados:
        df_plot_est = df_plot[(df_plot['ESTADO'] == estado)]
        x = df_plot_est['DATA_INICIAL']
        y = df_plot_est['PREÇO_MÉDIO_REVENDA']
        ax.plot(x, y, 
                   label = df_plot_est['ESTADO'].iloc[0],
                   alpha = 0.5)
    plt.legend()
    plt.title('PREÇO MÉDIO REVENDA - ' + df_plot['REGIÃO'].iloc[0] + ' - ' + df_plot['PRODUTO'].iloc[0])
    plt.show()

b. Os gráficos devem ser interpretados e discutidos, e as conclusões acerca dos mesmos e das questões de negócio devem ser apresentadas.

Pelos gráficos acima podemos observar similaridade no comportamento das curvas entre os Estados, entretanto o preço médio praticado é diferente para cada região, sendo que o Norte apresentou os maiores preços de revenda. A título de exemplo temos o Estado do Acre com o maior pico de preço no segundo semestre de 2018 como resultado de um pico no preço do barril do petróleo.

Podemos observar que a política de Estado aparenta influenciar no preço médio de revenda dos combustíveis, dado que a partir de 2016 tivemos a entrada de um novo Governo com menor intervenção nos preços do petróleo (https://epbr.com.br/os-principios-e-as-distorcoes-da-politica-de-precos-dos-combustiveis/). Além disso notamos que o período de turbulência política aumentou bastante a volatilidade dos preços entre 2014 e 2016 (https://en.wikipedia.org/wiki/Impeachment_of_Dilma_Rousseff). Nos dias de hoje a Política adotada pela Petrobrás (https://petrobras.com.br/fatos-e-dados/adotamos-nova-politica-de-precos-de-diesel-e-gasolina.htm) permite maior flexibilidade na gestão comercial de derivados do petróleo, refletindo em curvas menos estáveis, acompanhando o preço internacional do pretróleo, como podemos notar através de inspeção visual (https://www.tradingview.com/symbols/OANDA-BCOUSD/).

In [13]:
from IPython.display import Image
PATH = "../../reports/figures/"
Image(filename = PATH + "oil_price.PNG")
Out[13]:

6. CONCLUSÕES: Relembrar a questão levantada e sumarizar as conclusões obtidas.

Os dados da ANP com o histórico de preços de combustíveis nos permitiu observar diferenças importantes de preços médios entre os Estados do Brasil, denotando uma desigualdade regional. Adicionalmente podemos observar também que a política de preços mais intervencionista do Estado no período anterior a 2016 fazia com que o preço médio de revenda não acompanhasse a movimentação do preço do barril de petróleo. A partir de 2016, quando políticas mais liberalistas foram implementadas, foi possível observar que o preço médio praticado acompanhou melhor as movimentações do barril do petróleo, muito embora tenhamos notado uma curva com maior inclinação, indicando um aumento de preços mais agressivo do que o praticado internacionalmente.